
`timescale 1 ns / 10 ps

//  *************************************************************************
//  File : crc32galstep8c
//  *************************************************************************
//  This program is controlled by a written license agreement.
//  Unauthorized Reproduction or Use is Expressly Prohibited. 
//  Copyright [c] 2000 Morethanip
//  info@morethanip.com
//  *************************************************************************
//   Version:    $Id: crc32galstep8c.v,v 1.1 2009/07/09 00:23:23 dk Exp $
//   Author:     Morethanip, Daniel Koehler
//  *************************************************************************
//  Description:
// 
//  8 Bit Galois Field Multiplier
//  *************************************************************************

module crc32galstep8c (

   data,
   crc_in,
   crc_out);

input   [7:0] data;             //  new input data
input   [31:0] crc_in;          //  current CRC value
output  [31:0] crc_out;         //  new CRC value

assign crc_out[0] = crc_in[2] ^ crc_in[8]; 
assign crc_out[1] = crc_in[0] ^ crc_in[3] ^ crc_in[9]; 
assign crc_out[2] = crc_in[0] ^ crc_in[1] ^ crc_in[4] ^ crc_in[10]; 
assign crc_out[3] = crc_in[1] ^ crc_in[2] ^ crc_in[5] ^ crc_in[11]; 
assign crc_out[4] = crc_in[0] ^ crc_in[2] ^ crc_in[3] ^ crc_in[6] ^  crc_in[12]; 
assign crc_out[5] = crc_in[1] ^ crc_in[3] ^ crc_in[4] ^ crc_in[7] ^  crc_in[13]; 
assign crc_out[6] = crc_in[4] ^ crc_in[5] ^ crc_in[14]; 
assign crc_out[7] = crc_in[0] ^ crc_in[5] ^ crc_in[6] ^ crc_in[15]; 
assign crc_out[8] = crc_in[1] ^ crc_in[6] ^ crc_in[7] ^ crc_in[16]; 
assign crc_out[9] = crc_in[7] ^ crc_in[17]; 
assign crc_out[10] = crc_in[2] ^ crc_in[18]; 
assign crc_out[11] = crc_in[3] ^ crc_in[19]; 
assign crc_out[12] = crc_in[0] ^ crc_in[4] ^ crc_in[20]; 
assign crc_out[13] = crc_in[0] ^ crc_in[1] ^ crc_in[5] ^ crc_in[21]; 
assign crc_out[14] = crc_in[1] ^ crc_in[2] ^ crc_in[6] ^ crc_in[22]; 
assign crc_out[15] = crc_in[2] ^ crc_in[3] ^ crc_in[7] ^ crc_in[23]; 
assign crc_out[16] = crc_in[0] ^ crc_in[2] ^ crc_in[3] ^ crc_in[4] ^  crc_in[24]; 
assign crc_out[17] = crc_in[0] ^ crc_in[1] ^ crc_in[3] ^ crc_in[4] ^  crc_in[5] ^ crc_in[25]; 
assign crc_out[18] = crc_in[0] ^ crc_in[1] ^ crc_in[2] ^ crc_in[4] ^  crc_in[5] ^ crc_in[6] ^ crc_in[26]; 
assign crc_out[19] = crc_in[1] ^ crc_in[2] ^ crc_in[3] ^ crc_in[5] ^  crc_in[6] ^ crc_in[7] ^ crc_in[27]; 
assign crc_out[20] = crc_in[3] ^ crc_in[4] ^ crc_in[6] ^ crc_in[7] ^  crc_in[28]; 
assign crc_out[21] = crc_in[2] ^ crc_in[4] ^ crc_in[5] ^ crc_in[7] ^  crc_in[29]; 
assign crc_out[22] = crc_in[2] ^ crc_in[3] ^ crc_in[5] ^ crc_in[6] ^  crc_in[30]; 
assign crc_out[23] = crc_in[3] ^ crc_in[4] ^ crc_in[6] ^ crc_in[7] ^  crc_in[31]; 
assign crc_out[24] = crc_in[0] ^ crc_in[2] ^ crc_in[4] ^ crc_in[5] ^  crc_in[7] ^ data[0]; 
assign crc_out[25] = crc_in[0] ^ crc_in[1] ^ crc_in[2] ^ crc_in[3] ^  crc_in[5] ^ crc_in[6] ^ data[1]; 
assign crc_out[26] = crc_in[0] ^ crc_in[1] ^ crc_in[2] ^ crc_in[3] ^  crc_in[4] ^ crc_in[6] ^ crc_in[7] ^ data[2]; 
assign crc_out[27] = crc_in[1] ^ crc_in[3] ^ crc_in[4] ^ crc_in[5] ^  crc_in[7] ^ data[3]; 
assign crc_out[28] = crc_in[0] ^ crc_in[4] ^ crc_in[5] ^ crc_in[6] ^  data[4]; 
assign crc_out[29] = crc_in[0] ^ crc_in[1] ^ crc_in[5] ^ crc_in[6] ^  crc_in[7] ^ data[5]; 
assign crc_out[30] = crc_in[0] ^ crc_in[1] ^ crc_in[6] ^ crc_in[7] ^  data[6]; 
assign crc_out[31] = crc_in[1] ^ crc_in[7] ^ data[7]; 

endmodule
